package filter

import (
	"fmt"
	"strings"
)

type DataType int

const NotExitType DataType = -1

const (
	Text              DataType = iota // 文本框
	TextArea                          // 多行文本框
	MobilePhone                       // 手机
	LandLine                          // 座机
	Email                             // 邮箱
	Num                               // 数值
	Certificates                      // 证件
	Amount                            // 数量
	Radio                             // 单选框
	CheckBox                          // 多选框
	Select                            // 多选框
	Personnel                         // 单成员
	People                            // 多成员
	Attachment                        // 附件
	DATE                              // 日期
	TIME                              // 时间
	DateTime                          // 日期和时间
	DateSpan                          // 日期段
	DateTimeSpan                      // 日期时间段
	DISTRICT1                         // 地区(省)
	FORMULA                           // 公式
	RELATION                          // 自由连接
	SplitLine                         // 分段
	DISTRICT2                         // 地区(省-市)
	DISTRICT3                         // 地区(省-市-县)
	BigAmount                         // 大写金额
	UserSelect                        // 人员
	DepartmentSelect                  // 部门
	SCORE                             // 等级
	RelationWorksheet                 // 表关联
	RelationWsColumn                  // 关联表字段
	WsFormula                         // 工作表公式
	FormulaString                     // 文本拼接
	INCREASE                          // 自动编号
	DetailTable                       // 子表
	CASCADE                           // 级联选择
	CheckRadio                        // 检查框
	SUMMARY                           // 汇总
	FormulaDate                       // 公式(日期)
	ScanCode                          // 扫码
	LOCATION                          // 定位
	RichText                          // 富文本
	SIGNATURE                         // 签名
	RATE                              // 评分
	SLIDER                            // 滑动输入条
	UploadFile                        // 上传文件
	UploadImg                         // 上传图片
	TreeSelect                        // 树选择器
	BATCH                             // 动态表格
	SWITCH                            // 开关
	BUTTON                            // 按钮
	ALERT                             // 警告提示
	TextFont                          // 文字
	HTML                              // HTML
	TimeRange                         // 时间范围
	Color                             // 颜色选择器
	Model                             // 模型
	Point                             // 点
	LineString                        // 线
	Polygon                           // 面
	GeoCollection                     // GeoCollection
	ScanableInput                     // 可扫描输入
	CurLoc                            // 当前位置
	Member                            //member 63
	CurrentTime                       //CurrentTime
)

func (d DataType) FilterKey(field string) string {
	switch d {
	case Member:
		return fmt.Sprintf("%s.label", field)
	default:
		return field
	}
}

type DataTypeProperty struct {
	Desc string
	BaseDataType
}

func GetDataTypeProperty(dataType DataType) *DataTypeProperty {
	if v, ok := DataTypeMap[dataType]; ok {
		return &v
	}
	return nil
}

var DataTypeMap = map[DataType]DataTypeProperty{
	Text:              {"input", String},    // "文本框",
	TextArea:          {"textarea", String}, // "多行文本框",
	MobilePhone:       {"手机", String},
	LandLine:          {"座机", String},
	Email:             {"邮箱", String},
	Num:               {"number", Number}, // "数值",
	Certificates:      {"证件", String},
	Amount:            {"数量", Number},
	Radio:             {"radio", Any},      // "单选框", 数值或字符串
	CheckBox:          {"checkbox", Array}, // "多选框",
	Select:            {"select", Any},     // "下拉框",
	Personnel:         {"单成员", Any},
	People:            {"多成员", Any},
	Attachment:        {"附件", Any},
	DATE:              {"date", Any},  // "日期",
	TIME:              {"time", Date}, // "时间",
	DateTime:          {"日期和时间", Date},
	DateSpan:          {"date-range", Array}, // 日期范围
	DateTimeSpan:      {"日期时间段", Array},
	TimeRange:         {"time-range", Array}, // 时间范围
	DISTRICT1:         {"地区(省)", Any},
	FORMULA:           {"公式", Any},
	RELATION:          {"自由连接", Any},
	SplitLine:         {"分段", Any},
	DISTRICT2:         {"地区(省-市)", Any},
	DISTRICT3:         {"地区(省-市-县)", Any},
	BigAmount:         {"大写金额", Any},
	UserSelect:        {"人员", Any},
	DepartmentSelect:  {"部门", Any},
	SCORE:             {"等级", Any},
	RelationWorksheet: {"表关联", Any},
	RelationWsColumn:  {"关联表字段", Any},
	WsFormula:         {"工作表公式", Any},
	FormulaString:     {"文本拼接", Any},
	INCREASE:          {"自动编号", Any},
	DetailTable:       {"sub-form", Any},   // 子表
	CASCADE:           {"cascader", Array}, // "级联选择",
	CheckRadio:        {"检查框", Any},
	SUMMARY:           {"汇总", Any},
	FormulaDate:       {"公式(日期)", Any},
	ScanCode:          {"扫码", Any},
	LOCATION:          {"定位", Any},
	RichText:          {"rich-editor", String}, // "富文本",
	SIGNATURE:         {"签名", Any},
	RATE:              {"rate", Number},          // 评分
	SLIDER:            {"slider", Number},        // 滑动输入条
	UploadFile:        {"file-upload", Any},      // 上传文件
	UploadImg:         {"picture-upload", Any},   // 上传图片
	TreeSelect:        {"treeSelect", Any},       // 树选择器
	BATCH:             {"batch", Any},            // 动态表格
	SWITCH:            {"switch", Boolean},       // 开关
	BUTTON:            {"button", Any},           // 按钮
	ALERT:             {"alert", Any},            // 警告提示
	TextFont:          {"text", Any},             // 文字
	HTML:              {"html", Any},             // html
	Color:             {"color", String},         // 颜色选择器
	Model:             {"model", Array},          // 模型
	Point:             {"point", Any},            // geo 点
	LineString:        {"line-string", Any},      // geo 线
	Polygon:           {"polygon", Any},          // geo 面
	GeoCollection:     {"geoCollection", Any},    // geo 集合
	ScanableInput:     {"scanableInput", String}, // 可扫描输入
	CurLoc:            {"curLoc", Any},           // 当前位置
	Member:            {"member", String},        // 当前Member
	CurrentTime:       {"currentTime", Any},      // 当前Time
}

var DataTypeMapReverse = map[string]DataType{}

func init() {
	for dataType, property := range DataTypeMap {
		DataTypeMapReverse[property.Desc] = dataType
	}
}

// GetDataType 获取数据类型
func GetDataType(dataType string) DataType {
	if d, ok := DataTypeMapReverse[dataType]; ok {
		return d
	}

	return NotExitType
}

func DataTypeByObjectType(typ string) DataType {
	switch strings.ToLower(typ) {
	case "string":
		return Text
	case "number":
		return Num
	default:
		return Text
	}
}
